home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
4_0
/
UUPC3
/
MAC_SPEC
/
UNIX_LIB
/
NDIR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-04
|
4KB
|
184 lines
#ifdef THINK_C
# include "unixlibproto.h"
# include "stdlib.h"
# include "string.h"
#endif THINK_C
#include "ndir.h"
#include <stdio.h>
#ifndef THINK_C
#include <pb.h>
#endif THINK_C
#ifdef TEST
#include <stdio.h>
#define _DEBUG
#include <max/debug.h>
#endif
/*
* support for Berkeley directory reading routine on a V7 file system
*/
/*
* open a directory.
*/
DIR *
opendir(name)
char *name;
{
static DIR dir;
register DIR *dirp = &dir;
register int fd;
char buf[255];
CInfoPBRec cpb;
WDPBRec wdpb;
int err, currDir;
/* remember current dir */
(void) GetVol((StringPtr) buf, &currDir);
/* fix name, and get volume reference number */
cnvMac(name, buf);
cpb.dirInfo.ioVRefNum = 0;
cpb.dirInfo.ioNamePtr = (StringPtr)CtoPstr(buf);
cpb.dirInfo.ioFDirIndex = 0;
cpb.dirInfo.ioDrDirID = 0L;
#ifdef TEST
fprintf( stderr, "opendir: %s\n", buf );
#endif
if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
#ifdef TEST
fprintf( stderr, "setdir: PBGetCatInfo %d\n", err );
#endif
return((DIR *)NULL);
}
/**** repeated calls to malloc fill up system heap [3/24/90 garym]
if((dirp=(DIR *)malloc(sizeof(DIR))) == (DIR *)NULL) {
fprintf(stderr, "opendir: couldn't malloc %d got 0x%x\n", sizeof(DIR), dirp);
return((DIR *)NULL);
}
****/
dirp->ioVRefNum = cpb.dirInfo.ioVRefNum;
dirp->ioDrDirID = cpb.dirInfo.ioDrDirID;
dirp->ioFDirIndex = 1;
dirp->currdir = currDir;
#ifdef UNDEF
wdpb.ioCompletion = NULL;
wdpb.ioNamePtr = NULL;
wdpb.ioVRefNum = cpb.dirInfo.ioVRefNum;
wdpb.ioWDProcID = 'UUPC';
wdpb.ioWDDirID = cpb.dirInfo.ioDrDirID;
wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
if (PBOpenWD(&wdpb, FALSE) != noErr) {
return((DIR *)NULL);
}
dirp->ioVRefNum = wdpb.ioVRefNum; /* remember the WD id */
wdpb.ioVRefNum = 0;
if (SetVol((int)NULL, dirp->ioVRefNum ) != noErr) {
return((DIR *)NULL);
}
#endif UNDEF
#ifdef TEST
fprintf( stderr, "opendir: # %ld\n", cpb.u.di.ioDrDirID );
#endif
return(dirp);
}
/*
* get next entry in a directory.
*/
struct direct *
readdir(dirp)
register DIR *dirp;
{
CInfoPBRec cpb;
int err;
static struct direct dir;
#ifdef TEST
fprintf( stderr, "readdir: v:%d d:%ld i:%d\n",
dirp->ioVRefNum, dirp->ioDrDirID, dirp->ioFDirIndex );
#endif
strcpy( dir.d_name, "" );
cpb.dirInfo.ioNamePtr = (StringPtr)dir.d_name;
cpb.dirInfo.ioVRefNum = dirp->ioVRefNum;
cpb.dirInfo.ioDrDirID = dirp->ioDrDirID;
cpb.dirInfo.ioFDirIndex = dirp->ioFDirIndex++;
if ((err = PBGetCatInfo( &cpb, 0 )) != 0 ) {
#ifdef TEST
fprintf( stderr, "readdir: err %d\n", err );
#endif
return NULL;
}
dir.d_ino = 0;
PtoCstr( dir.d_name );
#ifdef TEST
fprintf( stderr, "readdir: OK \"%s\"\n", dir.d_name);
#endif
dir.d_namlen = strlen(dir.d_name);
dir.d_reclen = DIRSIZ(&dir);
return (&dir);
}
/*
* close a directory.
*/
void
closedir(dirp)
register DIR *dirp; {
WDPBRec wdpb;
#ifdef UNDEF
(void) (NULL, dirp->currdir);
wdpb.ioCompletion = NULL;
wdpb.ioNamePtr = NULL;
wdpb.ioVRefNum = dirp->ioVRefNum;
wdpb.ioWDProcID = 'UUPC';
wdpb.ioWDDirID = dirp->ioDrDirID;
wdpb.ioWDIndex = wdpb.ioWDVRefNum = 0;
PBCloseWD (&wdpb, FALSE);
#endif UNDEF
if(dirp != (DIR *)NULL)
free((char *)dirp);
else
fprintf(stderr, "closedir: tried to free NULL *directory\n");
}
#ifdef TEST
#include <errno.h>
main()
{
char command[100];
struct DIR *dirp;
struct direct *dp;
while(gets(command) != NULL) {
fprintf( stderr, "test: %s\n", command );
if ((dirp = opendir( command )) == NULL ) {
fprintf( stderr, "couldn't open dir %s\n", command );
}
while ((dp = readdir(dirp)) != NULL)
fprintf( stderr, "%s", dp->d_name );
closedir( dirp );
}
}
#endif